package com.example.news.helper;

import static com.tencent.cloud.libqcloudtts.engine.offlineModule.auth.AuthErrorCode.OFFLINE_AUTH_SUCCESS;

import android.content.Context;
import android.util.Log;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import com.tencent.cloud.libqcloudtts.MediaPlayer.QCloudMediaPlayer;
import com.tencent.cloud.libqcloudtts.MediaPlayer.QCloudPlayerCallback;
import com.tencent.cloud.libqcloudtts.MediaPlayer.QPlayerError;
import com.tencent.cloud.libqcloudtts.TtsController;
import com.tencent.cloud.libqcloudtts.TtsError;
import com.tencent.cloud.libqcloudtts.TtsMode;
import com.tencent.cloud.libqcloudtts.TtsResultListener;
import com.tencent.cloud.libqcloudtts.engine.offlineModule.auth.QCloudOfflineAuthInfo;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

public class Ttshelper {
    private static final String TAG = "TtsDemo";
    private volatile TtsController mTtsController;
    public MediaPlayerDemo mediaPlayer; //使用SDK内置播放器
//    private MediaPlayerDemo mediaPlayer;//使用demo中提供的播放器，您可以修改播放器逻辑，源代码位于MediaPlayerDemo.java，与SDK内置播放器一致
    TtsMode mTtsmode = TtsMode.ONLINE;
    //离线参数
    String mOfflineVoiceType = "";//音色名，名称配置位于音色资源目录\voices\config.json 中
    float mOfflineVolume = 1.0f;//离线音量 > 0
    float mOfflineSpeed = 1.0f;//离线语速[0.5,2.0]
    //在线参数
    float mVoiceSpeed = -0.5f;
    float mVoiceVolume = 0f;
    int mVoiceType = 1001;
    int mVoiceTypearray[]={1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1017,1018,10510000};
    int mPrimaryLanguage = 1; //主语言类型：1-中文（默认）2-英文
    //时间配置
    int mConnectTimeout = 15 *1000; //连接超时默认15000ms(15s) 范围[500,30000] 单位ms ， Mix模式下建议调小此值，以获得更好的体验
    int mReadTimeout = 30 *1000; //读取超时超时默认30000ms(30s) 范围[2200,60000] 单位ms， Mix模式下建议调小此值，以获得更好的体验
    /**
     * mCheckNetworkIntervalTime
     * Mix模式下，已经连接网络，但出现网络错误或者后台错误后的检测间隔时间，用于从离线模式自动切换回在线模式，默认值5分钟
     * 注意：每次检测时将使用所入参的一句文本请求服务器，如果后端合成成功将会额外消耗该句字数的合成额度
     * 大于等于0 单位s, 等于0时持续检测，直到成功
     */
    int mCheckNetworkIntervalTime = 5 * 60;
    boolean isPlay = true;
    boolean isOfflineAuth = false;
    public Ttshelper(){}
    public void play(Context a,String text,int voice)
    {
        //获得TTS合成器实例
        mTtsController = TtsController.getInstance();
        /***********************在线参数设置，如果仅用离线合成 不需要设置***************/
        mTtsController.setSecretId("AKIDqJcnncHoX5SffdQ1d6QQGwa7WkngUnrq");
        mTtsController.setSecretKey("viOcieMr9B7yiO1gKuOlxvkMAyW5bvfF");
//        ttsController.setToken(null); //STS临时证书鉴权时需要设置Token
        //设置ProjectId 不设置默认使用0，说明：项目功能用于按项目管理云资源，可以对云资源进行分项目管理，详情见 https://console.cloud.tencent.com/project
        mTtsController.setOnlineProjectId(0);

        mTtsController.setOnlineVoiceSpeed(mVoiceSpeed);//设置在线所合成音频的语速,语速，范围：[-2，2]，分别对应不同语速：-2代表0.6倍,-1代表0.8倍,0代表1.0倍（默认）,1代表1.2倍,2代表1.5倍,如果需要更细化的语速，可以保留小数点后一位，例如0.5 1.1 1.8等。
        mTtsController.setOnlineVoiceVolume(mVoiceVolume); //设置在线所合成音频的音量
        mTtsController.setOnlineVoiceType(mVoiceTypearray[voice]);//设置在线所合成音频的音色id,完整的音色id列表见https://cloud.tencent.com/document/product/1073/37995
        mTtsController.setOnlineVoiceLanguage(mPrimaryLanguage);//主语言类型：1-中文（默认）2-英文

        mTtsController.setConnectTimeout(mConnectTimeout);
        mTtsController.setReadTimeout(mReadTimeout);
        mTtsController.setCheckNetworkIntervalTime(mCheckNetworkIntervalTime);
        /***********************以上为 在线参数设置 ，如果仅用离线合成 不需要设置***************/

        mTtsController.init(a,mTtsmode , new TtsResultListener() {
            /**
             * @param offlineAuthInfo 返回离线sdk授权信息，包含错误码、到期时间、当前设备ID
             *  注意，如果使用离线模式，需要收到此回调后再调用合成接口，否则可能会因授权失败导致合成失败！！！
             */
            @Override
            public void onOfflineAuthInfo(QCloudOfflineAuthInfo offlineAuthInfo) {
                if(offlineAuthInfo.getError().getCode() == OFFLINE_AUTH_SUCCESS.getCode()){
                    isOfflineAuth = true;
                    Log.d(TAG, "tts离线引擎授权成功" + "到期时间："+offlineAuthInfo.getExpireTime() + "deviceid："+offlineAuthInfo.getDeviceId() + "debug info:"+offlineAuthInfo.getResponse());
                    ShowMsg("tts离线引擎授权成功" + "\n到期时间："+offlineAuthInfo.getExpireTime() + "\ndeviceid："+offlineAuthInfo.getDeviceId() + "\ndebug info:"+offlineAuthInfo.getResponse());
                } else {
                    Log.d(TAG, "tts离线引擎授权失败:" + offlineAuthInfo.getError().getMessage() + " 到期时间："+offlineAuthInfo.getExpireTime() + "deviceid："+offlineAuthInfo.getDeviceId() + "debug info:"+offlineAuthInfo.getResponse());
                    ShowMsg("tts离线引擎授权失败:" + offlineAuthInfo.getError().getMessage() + " \n到期时间："+offlineAuthInfo.getExpireTime() + "\ndeviceid："+offlineAuthInfo.getDeviceId() + "\ndebug info:"+offlineAuthInfo.getResponse());
                }

            }
            /**
             * @param bytes 语音数据
             * @param utteranceId 语句id
             * @param text 文本
             * @param engineType 引擎类型 0:在线 1:离线
             */
            @Override
            public void onSynthesizeData(byte[] bytes, String utteranceId, String text, int engineType) {
                Log.d(TAG, "onSynthesizeData: " + bytes.length + ":" + utteranceId + ":" + text + ":" + engineType);
                ShowMsg("success:"+"data length=" + bytes.length + "   text = "+ text );

                if (isPlay) {
                    if (mediaPlayer == null)return;
                    //将合成语音数据送入SDK内置播放器，如果sdk的内置播放器无法满足您的需求，您也可以使用自己实现的播放器替换
                    QPlayerError err = mediaPlayer.enqueue(bytes, text, utteranceId);
                    if (err != null){
                        Log.d(TAG, "mediaPlayer enqueue error" + err.getmMessage());
                        ShowMsg("mediaPlayer enqueue error" + err.getmMessage());
                    }
                } else {
                    //将byteBuffer保存到文件
                    try {
                        File file = null;
                        if (engineType == 1){
                            file = File.createTempFile("temp", ".wav");
                        } else {
                            file = File.createTempFile("temp", ".mp3");
                        }

                        OutputStream os = new FileOutputStream(file);
                        os.write(bytes);
                        os.flush();
                        os.close();
                        //QPlayerError err = mediaPlayer.enqueue(file, text, utteranceId);     //播放器也支持文件入参
                        Log.d(TAG, "file: "+file.toString());
                        ShowMsg("合成成功,保存音频文件路径为：" + file.toString());

                    } catch (IOException e) {
                        ShowMsg("合成成功,保存音频文件失败：" + e.toString());
                        return;
                    }
                }
            }
            /**
             * @param error 错误信息
             * @param text 文本(如果有则返回)
             * @param utteranceId 语句id(如果有则返回)
             */
            @Override
            public void onError(TtsError error, String utteranceId, String text) {
                Log.d(TAG, "onError: " + error.getCode() + ":" + error.getMessage() + ":" + utteranceId);


                if (error.getServiceError() != null) { //后端返回的错误，错误码见 https://cloud.tencent.com/document/product/1073/37995

                    if (mTtsmode == TtsMode.MIX){
                        //实际业务上判断一下，如果是混合模式下返回在线合成的后端错误码，应当忽略可不做处理
                        //SDK内会继续调用离线合成继续工作,如果没有日志需求，这里直接return忽略即可
                        //return;
                    }

                    Log.d(TAG, "Server response error: " + error.getServiceError().getCode() + ":" + error.getServiceError().getMessage() + ":" + utteranceId);

                    ShowMsg("Server response error：" + error.getServiceError().getCode() + ":" + error.getServiceError().getMessage());
                    if (error.getServiceError().getResponse() != null){
                        ShowMsg("Server response :" + error.getServiceError().getResponse());
                    };
                } else {
                    ShowMsg("合成失败：" + error.getCode() + ":" + error.getMessage());
                }

                if (error.getThrowable() != null) {
                    Log.d(TAG, "Throwable err: " + error.getThrowable().toString());
                    ShowMsg("Throwable err：" + error.getThrowable().toString());

                }
            }
        });
        mediaPlayer = new MediaPlayerDemo(new QCloudPlayerCallback() {

            @Override
            public void onTTSPlayStart() {
                Log.d(TAG, "开始播放");
                ShowMsg("开始播放");
            }

            @Override
            public void onTTSPlayWait() {
                Log.d(TAG, "播放完成，等待音频数据");
                ShowMsg("播放完成，等待音频数据");
            }

            @Override
            public void onTTSPlayResume() {
                Log.d(TAG, "恢复播放");
                ShowMsg("恢复播放");
            }

            @Override
            public void onTTSPlayPause() {
                Log.d(TAG, "暂停播放");
                ShowMsg("暂停播放");
            }

            @Override
            public void onTTSPlayNext(String text, String utteranceId) {
                Log.d(TAG, "开始播放: " + utteranceId + "|" + text);
                ShowMsg("即将播放:"+utteranceId + ":" + text);
            }

            @Override
            public void onTTSPlayStop() {
                Log.d(TAG, "播放停止，内部队列已清空");
                ShowMsg("播放停止或手动取消");
            }

            @Override
            public void onTTSPlayError(QPlayerError error) {
                Log.d(TAG, "播放器发生异常:"+error.getmCode() + ":" + error.getmMessage());
                ShowMsg("播放器发生异常:"+error.getmCode() + ":" + error.getmMessage());
            }

            /**
             * @param currentWord 当前播放的字符
             * @param currentIndex 当前播放的字符在所在的句子中的下标.
             */
            @Override
            public void onTTSPlayProgress(String currentWord, int currentIndex) {
//                Log.d(TAG, "onTTSPlayProgress: " + currentWord + "|" + currentIndex);
//                ShowMsg("onTTSPlayProgress:" + "|" + currentWord + "|" + currentIndex );
            }
        });
        TtsError error = mTtsController.synthesize(text);
//                TtsError error = mTtsController.synthesize(ttsText,"第一句");
        if (error != null){
            ShowMsg("合成发生错误:"+error.getMessage());
        }
    }
    public void stopplay()
    {
        if (mediaPlayer != null) {
            mediaPlayer.PausePlay();
        }
    }
    public void conselplay()
    {
        if (mTtsController != null) {
            mediaPlayer.StopPlay();
            mTtsController.cancel();
        }
    }
    //日志信息框
    private void ShowMsg(String message) {
        Log.i(TAG, message);
    }
}

